import type { ExtractResponseData, GetStatusConfigsResponse } from "@follow-app/client-sdk"
import type { FC } from "react"

import { useFeature } from "~/hooks/biz/useFeature"

/**
 * 功能配置映射表
 * 定义本地功能键与服务器配置键之间的映射关系
 * 这里是类型安全的对象，确保所有键都对应到GetStatusConfigsResponse中的有效字段
 */
export const featureConfigMap = {
  // AI聊天功能配置键映射
  ai: "AI_CHAT_ENABLED",
} satisfies Record<string, keyof ExtractResponseData<GetStatusConfigsResponse>>

/**
 * 高阶组件工厂函数：创建基于功能开关的组件包装器
 * 用于根据功能启用状态条件性地渲染不同组件
 * @param feature - 要检查的功能键
 * @returns 一个高阶组件，接收两个组件参数并返回条件渲染的组件
 */
export const withFeature =
  (feature: keyof typeof featureConfigMap) =>
  <T extends object>(Component: FC<T>, FallbackComponent: FC<T>) => {
    /**
     * 条件渲染组件
     * @param props - 传递给组件的props
     * @returns 根据功能启用状态渲染相应的组件
     */
    const WithFeature = ({ ...props }: T) => {
      // 使用useFeature钩子检查功能是否启用
      const isEnabled = useFeature(feature)

      // 根据功能状态返回对应组件
      return isEnabled ? <Component {...props} /> : <FallbackComponent {...props} />
    }

    return WithFeature
  }
